#include<stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>

/**
设计一个高效算法，将顺序表L的所有的所有元素逆置，要求算法的空间复杂度为O(1)
**/

#define MAXSIZE 10
typedef int ElemType;  // 定义元素类型
typedef struct
{
   ElemType data[MAXSIZE];  // 定义表长度
   int length; // 当前长度
}SqList;

// 初始化
bool InitList(SqList &L){
    for(int i=0;i<MAXSIZE; i++) L.data[i]=0;
    L.length=0;
    return true;
}

// 插入
bool ListInsert(SqList &L, ElemType e, int loc){
    // 判断位置有效范围
    if (loc < 1 || loc > L.length+1) return false;
    // 判断空间是否溢出
    if (L.length >= MAXSIZE) return false;
    // 这个是元素往后移
    for(int i=L.length; i >= loc; i--)
        L.data[i] = L.data[i-1];
    L.data[loc-1] = e;
    L.length += 1;
    return true;
}

bool Inverse(SqList &L){
    if (L.length==0 || L.length==1) return true;
    ElemType e;
    printf("%d...", L.length);
    for(int i=0; i<L.length/2; i++){
        e = L.data[i];
        L.data[i] = L.data[L.length-i-1];
        L.data[L.length-i-1] = e;
    }
    return true;
}

// 输出操作
void PrintList(SqList L){
    for(int i=0;i<MAXSIZE; i++){
        printf("%d;", L.data[i]);
    }
    printf("\n");
}

int main(){
    SqList L;
    ElemType e;
    InitList(L);
    ListInsert(L, 1, 1);
    ListInsert(L, 2, 1);
    ListInsert(L, 3, 1);
    ListInsert(L, 4, 1);
    ListInsert(L, 5, 1);
    ListInsert(L, 6, 1);
    ListInsert(L, 7, 1);
    PrintList(L);
    Inverse(L);
    PrintList(L);
    printf("\n");
    printf("min:%d", e);
    system("pause");
    return 0;
}
